<?php
class AFacturaCliente {

	public function __construct() {
	}

	public function condicionPago(EFacade & $facade) {

		//Afectar a la cuenta de ventas
		/**TODO:  Afectar a la cuenta ventas correspondiente
		 * 
		 */

		$ezpdo_ = getManager();

		//lanzar la transicion

		//echo "lo que hay que pagar es: ",$odcFC->totalAPagar;
		$session = $facade->session;
		// -----------------------------
		// generar las solicitudes asociadas
		// -----------------------------
		//echo "va a generar solicitud de produccion en el ACotizacionProducicon";
		$docFC = & $facade->getDocumentRoot();
		//$docOC = & $docIM->asociadoA;
		$network = $docFC->workflowRef->networkRef;

		$query = 'FROM MConfiguracionCuenta as t WHERE t.documento.oid=?';
		$configuracion = $ezpdo_->find($query, $network->epGetObjectId());
		//echo '<br>configuracion contable',$configuracion[0];
		$listaProductos = $docCP->listaProductos;

		$cliente = & $docFC->cliente;

		if ($cliente->cuenta == NULL) {
			$cuentaCliente = $session->create('MCuentaCliente');
			$cliente->cuenta = $cuentaCliente;
		} else {
			$cuentaCliente = & $cliente->cuenta;
		}
		$listaCuotas = & $cuentaCliente->cuotasCliente;
		$saldoCliente = $cliente->cuenta->saldo;

		$cuentaCliente->commit();

		$listaFacturas = & $cuentaCliente->facturasCliente;
		$listaFacturas[] = $docFC;
		//echo "<br>",$docCP;

		/*
		 * veo los plazos y genero las cuentas y giros
		 */

		$totalPagado = 0;

		//Notas de crédito
		$notasCredito = $docFC->notaCreditoList;

		foreach ($notasCredito as $notaList) {
			$monto = $notaList->monto;
			$totalPagado += $monto;
			$DNota = $notaList->nota;
			$importe = $DNota->importeTotal;
			$montoUsado = $DNota->montoUsado;
			$montoUsadoNuevo = $montoUsado +stringToNumber($monto);
			$DNota->montoUsado = $montoUsadoNuevo;
			$nuevoImporte = $importe -stringToNumber($monto);
			$DNota->importeTotal = $nuevoImporte;
			$DNota->commit();
			//habilitar la red y disparar

			/**TODO: Verificar esto
			 * 
			 */

			//			$newEfacade =& EFacade :: initWorkflow($facade->session, $DNota, & $role);
			//			//echo "<br>Inicia el wf de orden de actividad";
			//			//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
			//			$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);
			//			//echo "newefacde de OA es: ",$newEfacade;
			//			//echo "<br>el transsetOT es: ",$transSetOT;
			//			$transOT = $transSetOT->getTransByName('t3');
			//			//echo "<br>transOA",$transOT;
			//			$usuario=NULL;
			//			$newEfacade->fireTrans($transOT, $usuario, "actualizar",TRUE);
			////						echo "<br><br>EL DOCROOT ES: ",$docRoot;
			//			$DNota->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
			//			$newEfacade->saveWorkflow();
			//			$DNota->commit();
			//			//echo "<br>acabo de crerar el giro ",$docGC;
			//			unset($newEfacade);
			//			$facade->session->evictAll('MEdge');
			//			$facade->session->evictAll('MTrans');
			//			$facade->session->evictAll('MPlace');
		}

		$notasDevolucion = $docFC->notaDevolucionList;

		foreach ($notasDevolucion as $notaList) {
			$monto = $notaList->monto;
			$totalPagado += $monto;
			$DNota = $notaList->notaDevolucion;
			$importe = $DNota->importeTotal;
			$montoUsado = $DNota->montoUsado;
			$montoUsadoNuevo = $montoUsado +stringToNumber($monto);
			$DNota->montoUsado = $montoUsadoNuevo;
			$nuevoImporte = $importe -stringToNumber($monto);
			$DNota->importeTotal = $nuevoImporte;
			$DNota->commit();
			//habilitar la red y disparar

			/**TODO: Verificar esto
			 * 
			 */

			//			$newEfacade =& EFacade :: initWorkflow($facade->session, $DNota, & $role);
			//			//echo "<br>Inicia el wf de orden de actividad";
			//			//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
			//			$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);
			//			//echo "newefacde de OA es: ",$newEfacade;
			//			//echo "<br>el transsetOT es: ",$transSetOT;
			//			$transOT = $transSetOT->getTransByName('t3');
			//			//echo "<br>transOA",$transOT;
			//			$usuario=NULL;
			//			$newEfacade->fireTrans($transOT, $usuario, "actualizar",TRUE);
			////						echo "<br><br>EL DOCROOT ES: ",$docRoot;
			//			$DNota->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
			//			$newEfacade->saveWorkflow();
			//			$DNota->commit();
			//			//echo "<br>acabo de crerar el giro ",$docGC;
			//			unset($newEfacade);
			//			$facade->session->evictAll('MEdge');
			//			$facade->session->evictAll('MTrans');
			//			$facade->session->evictAll('MPlace');
		}

		if ($docFC->anticipo) {
			$docFC->anticipo->pagado = TRUE;
			$docFC->anticipo->commit();
			$totalPagado += $docFC->anticipo->importeTotal;
		}

		/*
		 * afectar las cuetnas dependiendo de como se haya pagado
		 * Caluclar el monto total pagado en este momento
		 */
		$cuentas = $configuracion[0]->cuenta;
		$totalVenta = stringToNumber($docFC->totalAPagar);

		//************CUENTA VENTAS ACTUALIZACION********************************//
		foreach ($cuentas as $c) {

			if ($c->posicion == 1) {
				///echo '<br>ventas por',$totalVenta;
				$c->cuentaContable->aumenta($totalVenta, $docFC);
				$c->cuentaContable->commit();
			}
		}

		if ($docFC->cuentaPorCobrar != 0) {

			$query1 = 'FROM MCuentaContable as t WHERE t.oid=?';
			$cuentaHja = $ezpdo_->find($query1, $docFC->cuentaPorCobrar);

		}

		//****************PENDIENTE ACTUALIZACION INVENTARIO************************//

		// Actualización de valores de caja de acuerdo al tipo de transacción
		// Creación de la transacción

		$formasPago = $docFC->formaPagoList;
		foreach ($formasPago as $formaPago) {
			$montoImpuesto = 0;
			$montoPagado = stringToNumber($formaPago->montoPago);
			$formaPago->montoPago = stringToNumber($formaPago->montoPago);
			$totalPagado += $montoPagado;
			//echo "lo pagado hasta ahorita es: ",$totalPagado;
			//echo "<br>la forma de pago es ",$formaPago->formaPago->cuentaCaja;
			// Asignar a las cuetnas de caja o banco el monto
			if ($cuentaCaja = & $formaPago->formaPago->cuentaCaja != NULL) {
				//echo "<br>entra aqui",$cuentaCaja;
				$saldoCajaViejo = $cuentaCaja->saldo;

				$sql = 'FROM MTipoTransaccion as t where t.cuentaCaja.oid = ?';
				$transacciones = $ezpdo_->find($sql, $cuentaCaja->epGetObjectId());
				//		echo "<br>aqui";
				$tipoTransaccion = $transacciones[0];
				$montoAumento = 0;

				$saldoCajaActualizado = $saldoCajaViejo + $montoPagado;

				//Crear la transaccion
				$transaccion = $session->create('MTransaccion');
				$fechaTransaccion = time();
				$montoTransaccion = $montoPagado;
				$transaccion->esCaja = TRUE;
				$transaccion->fechaTransaccion = $fechaTransaccion;
				$transaccion->montoTransaccion = $montoTransaccion;
				$transaccion->debe = $montoTransaccion;
				$transaccion->saldoCuenta = $saldoCajaActualizado;
				if (strlen($formaPago->detalle) > 0) {
					$detalle = "";
				} else {
					$detalle = " con " . $formaPago->formaPago->nombre . " " . $formaPago->detalle;
				}
				$descripcion = "Pago Factura " . $docFP->numeroFactura . $detalle;
				$transaccion->descripcion = $descripcion;
				$transaccion->tipoTransaccion = $tipoTransaccion;
				$transaccion->cuentaCaja = $cuentaCaja;
				$transaccion->documento = $docFC;
				$transaccion->commit();

				if ($porcentaje = $tipoTransaccion->porcentajeComision > 0) {
					$montoNuevo = $montoPagado * $porcentaje / 100;
					$montoImpuesto -= $montoNuevo;

					//transaccion por comision

					$saldoCajaActualizado -= $montoImpuesto;

					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $montoNuevo;
					$transaccion->esCaja = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Comision  " . $porcentaje . " %";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $saldoCajaActualizado;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->montoComision > 0) {

					$montoImpuesto -= $porcentaje;
					//transaccion por comision
					$saldoCajaActualizado -= $montoImpuesto;

					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $porcentaje;
					$transaccion->esCaja = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Comision  " . $porcentaje . " BsF";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $saldoCajaActualizado;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->porcentajeImpuesto > 0) {
					$montoNuevo = $montoPagado * $porcentaje / 100;
					$montoImpuesto -= $montoNuevo;

					//transaccion por impuesto
					$saldoCajaActualizado -= $montoImpuesto;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $montoNuevo;
					$transaccion->esCaja = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Impuesto " . $porcentaje . " %";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $saldoCajaActualizado;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->montoImpuesto > 0) {

					$montoImpuesto -= $porcentaje;
					$saldoCajaActualizado -= $montoImpuesto;

					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $porcentaje;
					$transaccion->esCaja = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Impuesto " . $porcentaje . " BsF";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $saldoCajaActualizado;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}

				$saldoCajaNuevo = $saldoCajaActualizado;
				//	echo "el saldo es ",$saldoCajaNuevo;
				$cuentaCaja->saldo = $saldoCajaNuevo;
				$cuentaCaja->cuentaContable->aumenta($montoPagado, $docFC);
				$cuentaCaja->cuentaContable->commit();

			} else {
				//echo "<br>entra aqui en el else";
				$cuentaCaja = & $formaPago->formaPago->cuentaBancaria;
				$saldoCajaViejo = $cuentaCaja->saldo;

				$saldoCajaActualizado = $saldoCajaViejo + $montoPagado;

				$sql = 'FROM MTipoTransaccion as t where t.cuentaBancaria.oid = ?';
				$transacciones = $ezpdo_->find($sql, $cuentaCaja->epGetObjectId());
				//		echo "<br>aqui";
				$tipoTransaccion = $transacciones[0];
				$montoAumento = 0;

				//Crear la transaccion
				$transaccion = $session->create('MTransaccion');
				$fechaTransaccion = time();
				$montoTransaccion = $montoPagado + $montoImpuesto;
				$transaccion->esBanco = TRUE;
				$transaccion->fechaTransaccion = $fechaTransaccion;
				$transaccion->montoTransaccion = $montoTransaccion;
				$transaccion->debe = $montoTransaccion;
				if (strlen($formaPago->detalle) > 0) {
					$detalle = "";
				} else {
					$detalle = " con " . $formaPago->formaPago->nombre . " " . $formaPago->detalle;
				}
				$descripcion = "Pago Factura " . $docFP->numeroFactura . $detalle;
				$transaccion->descripcion = $descripcion;
				$transaccion->tipoTransaccion = $tipoTransaccion;
				$transaccion->cuentaBanco = $cuentaCaja;
				$transaccion->documento = $docFC;
				$transaccion->saldoCuenta = $saldoCajaActualizado;
				$transaccion->commit();

				if ($porcentaje = $tipoTransaccion->porcentajeComision > 0) {
					$montoNuevo = $montoPagado * $porcentaje / 100;
					$montoImpuesto -= $montoNuevo;

					//transaccion por comision
					$saldoCajaActualizado -= $montoImpuesto;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $montoNuevo;
					$transaccion->esBanco = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Comision  " . $porcentaje . " %";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $saldoCajaActualizado;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->montoComision > 0) {

					$montoImpuesto -= $porcentaje;
					$saldoCajaActualizado -= $montoImpuesto;
					//transaccion por comision

					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $porcentaje;
					$transaccion->esBanco = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Comision  " . $porcentaje . " BsF";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $saldoCajaActualizado;
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->porcentajeImpuesto > 0) {
					$montoNuevo = $montoPagado * $porcentaje / 100;
					$montoImpuesto -= $montoNuevo;
					$saldoCajaActualizado -= $montoImpuesto;
					//transaccion por impuesto

					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $montoNuevo;
					$transaccion->esBanco = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Impuesto " . $porcentaje . " %";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $saldoCajaActualizado;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->montoImpuesto > 0) {

					$montoImpuesto -= $porcentaje;
					$saldoCajaActualizado -= $montoImpuesto;
					//transaccion por impuesto
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $porcentaje;
					$transaccion->esBanco = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Impuesto " . $porcentaje . " BsF";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $saldoCajaActualizado;
					$transaccion->commit();
					//echo "<br>la transaccion es: ",$transaccion;
					$facade->session->evictAll('MTransaccion');
				}

				$saldoCajaNuevo = $saldoCajaActualizado;
				//	echo "el saldo es ",$saldoCajaNuevo;
				$cuentaCaja->saldo = $saldoCajaNuevo;
				$cuentaCaja->cuentaContable->aumenta($montoPagado, $docFC);
				$cuentaCaja->cuentaContable->commit();
			}

			$cuentaCaja->commit();
		}

		//echo "<br> el total pagado es: ",$totalPagado;
		 $docFC->totalPagado = $totalPagado;

		$totalAPagar = stringToNumber($docFC->totalAPagar);
		$docFC->totalAPagar = $totalAPagar;

		$docFC->totalAntesIva = stringToNumber($docFC->totalAntesIva);
		$docFC->totalIva = stringToNumber($docFC->totalIva);
		$docFC->totalDescuento = stringToNumber($docFC->totalDescuento);
		$docFC->fechaTransaccion = stringToTime($docFC->fechaTransaccion);
		$docFC->baseImponible = stringToNumber($docFC->baseImponible);
		$docFC->porcentajeRetencionIVA = stringToNumber($docFC->porcentajeRetencionIVA);
		$docFC->montoRetencionIVA = stringToNumber($docFC->montoRetencionIVA);

		$restantePorPagar = $totalAPagar - $totalPagado;
		//echo "<br> cuenta cliente antes es: ",$cliente->cuenta;

		/*
		 * Colocación de información en la cuenta contable
		 * Información en el renglón
		 */

		$montoDeuda = $restantePorPagar;

		/**TODO: Verificar com ose va a buscar la cuenta contable
		 * 
		 */
		//		 $cuentaContableVenta=$session->get('MCuentaContable',2);
		//		 
		//		 $renglon=$session->create('MRenglonCuenta');
		//		 $fechaMovimiento=time();
		//		 $haber=$montoDeuda;
		//		 $renglon->fechaMovimiento=$fechaMovimiento;
		//		 $renglon->haber=$haber;

		/**TODO:
		 * Actualizar libro de Venta
		 */
		//$libro=$session->create('MLibroVenta');
		$montoSinIva = stringToNumber($docFC->totalAntesIva);
		$montoIva = stringToNumber($docFC->totalIva);

		$saldoClienteNuevo = $saldoCliente + $docFC->totalAPagar;

		$condicionPago = $docFC->condicionPago;
		//echo "<br>la cuenta de pago es: ",$cliente->cuenta;

		//estos es para llevar el historico del saldo de la cta client.... carlos
		$listaHistoricoCuentas = $session->create('MListaHistoricoCuentas');
		$listaHistoricoCuentas->fecha = date('U');
		if (count($docFC->formaPagoList)){
			$listaHistoricoCuentas->saldo = $saldoClienteNuevo;
			$listaHistoricoCuentas->referencia = $docFC->numero;
		}
		else{
			$listaHistoricoCuentas->saldo=$saldoCliente;
			$listaHistoricoCuentas->referencia = $docFC->numero.' Cancelada mediante pagos';
		}
		$listaHistoricoCuentas->debito = $docFC->totalAPagar;
		$docFC->commit();
		$docFC->numero = $docFC->getDocumentNumber();

		
		$listaHistoricoCuentas->documento = $docFC;

		//echo '<br>historico ',$listaHistoricoCuentas;
		$listaHistoricoCuentas->commit();
		////////////////////////////////////////////

		$cuentaCliente->historico[] = $listaHistoricoCuentas;
		$cuentaCliente->saldo = $saldoClienteNuevo;
		$cuentaCliente->epSetDirty(TRUE);
		$cuentaCliente->commit();

		$montoCuentaPorCobrar = 0;

		$montoTotal = $totalAPagar;
		$porcentajeRestante = 0;

		if ($restantePorPagar > 0) {
			
			if (count($cuentaHja[0]) > 0) {
				$cuentaHja[0]->aumenta($restantePorPagar, $docFC);
				$cuentaHja[0]->commit();
			}
			//echo "<br>aqui la condicion ",$condicionPago;
			//***********************ACTUALIZACION CUENTA POR COBRAR**************************************//
			$cuentas = $configuracion[0]->cuenta;
			foreach ($cuentas as $c) {
				if ($c->posicion == 3) {
					//	echo '<br>cuenta por cobrar',$restantePorPagar;
					$c->cuentaContable->aumenta($restantePorPagar, $docFC);
					$c->cuentaContable->commit();
				}
			}
			$numero = 0;

			foreach ($condicionPago->plazo as $plazo) {
				//echo '<br>plazo',$plazo;
				//echo "<br>entra en cada condicion la primera vez";
				if ($plazo->diasPlazo == 0 || $plazo->diasPlazo < 1 and count($docFC->formaPagoList)>0) {
					//echo "<br>plazo cero";
					$porcentaje = $plazo->porcentaje;
					$porcentajeRestante = 100 - $porcentaje;
					$montoPorCobrar = $restantePorPagar;
					$montoTotal = 100 * $restantePorPagar / $porcentajeRestante;

					$fecha = time();
					// recibo de pago
					$docRF = $session->create('DReciboFactura');
					$newEfacade = & EFacade :: initWorkflow($facade->session, $docRF, & $role);
					$docRF->montoPago = $docFC->totalPagado;
					$concepto = "Pago Factura " . $docFC->getNumeroFactura();
					$docRF->concepto = $concepto;
					$docRF->fecha = $fecha;
					//echo "<br>Inicia el wf de orden de actividad";
					//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
					$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */
					3);
					//echo "newefacde de OA es: ",$newEfacade;
					//echo "<br>el transsetOT es: ",$transSetOT;
					$transOT = $transSetOT->getTransByName('t1');
					//echo "<br>transOA",$transOT;
					$usuario = NULL;
					$newEfacade->fireTrans($transOT, $usuario, "Crear", TRUE);
					//						echo "<br><br>EL DOCROOT ES: ",$docRoot;
					$docRF->epSetDirty(TRUE); // marcar el documento para que sea salvado los cambios en su lista de items
					$newEfacade->saveWorkflow();
					$docRF->diferenciador = $docRF->getDocumentDifer();
					$docFC->cliente = $docFC->cliente;
					$docFC->recibo = $docRF;
					$docRF->commit();
					$docRF->numero = $docRF->getDocumentNumber();
					$docRF->diferenciador = $docRF->getDocumentDifer();

					///////////////historico del pago de contado/////////

					$listaHistoricoCuentas = $session->create('MListaHistoricoCuentas');
					$listaHistoricoCuentas->fecha = date('U');
					$listaHistoricoCuentas->saldo = $saldoClienteNuevo - $docFC->totalPagado;
					$listaHistoricoCuentas->credito = $docFC->totalPagado;

					$docFC->numero = $docFC->getDocumentNumber();

					$listaHistoricoCuentas->referencia = $docRF->numero;
					$listaHistoricoCuentas->documento = $docRF;
					$listaHistoricoCuentas->commit();
					//echo '<br>paga una parte ',$listaHistoricoCuentas;
					////////////////////////////////////////////
					$cuentaCliente->saldo = $saldoClienteNuevo - $docFC->totalPagado;
					$cuentaCliente->historico[] = $listaHistoricoCuentas;
					$cuentaCliente->commit();

					$docRF->commit();
					//echo "<br>acabo de crerar el recibo ",$docRF;
					unset ($newEfacade);
					$facade->session->evictAll('MEdge');
					$facade->session->evictAll('MTrans');
					$facade->session->evictAll('MPlace');
					break;
				}
			}
			//echo "<br>veo cuales son los plazos";
			$plazos = $condicionPago->plazo;
			$numCuota = 0;
			foreach ($plazos as $plazo) {

				//echo "<br>en el lazo de los plazos";
				if ($plazo->diasPlazo != 0) {
					//echo "<br> entra en el plazo";
					$porcentaje = $plazo->porcentaje;
					$montoCuota = $montoTotal * $porcentaje / 100;
					$diasPlazo = $plazo->diasPlazo;
					$segundosPlazo = $diasPlazo * 86400;
					$fechaActual = time();
					$fechaVencimiento = $fechaActual + $segundosPlazo;
					//echo '<br>--->',$docFC;
					if ($docFC->tieneGiro) {
						//echo '<br>giro';
						$numero++;
						$fechaVencimiento = $fechaActual + $segundosPlazo;
						//Creación del giro y asociación con el documento factura
						$docGC = $session->create('DGiroCliente');
						$docGC->factura = $docFC;
						$variantes = $ezpdo_->find('FROM MVariant as t WHERE t.name=?', 'ventas');
						$docGC->departamento = $docFC->departamento;
						$docGC->variante = $variantes[0];
						$docGC->numeroGiro = $numero;
						$docGC->cuentaCliente = $cuentaCliente;
						$docGC->fechaTransaccion = $fechaActual;
						$docGC->fechaVencimiento = $fechaVencimiento;
						$docGC->montoGiro = $montoCuota;
						$docGC->cliente = $cliente;

						//se crea la clase ke lleva el historico del saldo y documento que afecto la cta cliente... carlos

						$docGC->diferenciador = $docGC->getDocumentDifer();
						$docGC->commit();
						$docGC->numero = $docGC->getDocumentNumber();

						//hago el commit aki para poder pegarle el num del giro al historico... carlos

						$cuentaCliente->epSetDirty(TRUE);
						$cuentaCliente->commit();

						//echo "<br>creo el giro ",$docGC;
						/** para crear el workflow por primera vez **/
						$role = NULL;
						$newEfacade = & EFacade :: initWorkflow($facade->session, $docGC, & $role);
						//echo "<br>Inicia el wf de orden de actividad";
						//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
						$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */
						3);
						//echo "newefacde de OA es: ",$newEfacade;
						//echo "<br>el transsetOT es: ",$transSetOT;

						$transOT = $transSetOT->getTransByName('t1');
						//echo "<br>transOA",$transOT;
						$usuario = NULL;
						$newEfacade->fireTrans($transOT, $usuario, "Crear", TRUE);

						//						echo "<br><br>EL DOCROOT ES: ",$docRoot;
						$docGC->epSetDirty(TRUE); // marcar el documento para que sea salvado los cambios en su lista de items
						$newEfacade->saveWorkflow();

						//$docGC->diferenciador=$docGC->getDocumentDifer();
						$docGC->commit();

						unset ($newEfacade);

						$facade->session->evictAll('MEdge');
						$facade->session->evictAll('MTrans');
						$facade->session->evictAll('MPlace');

					} else {
						$numCuota = $numCuota +1;
						$cuota = $session->create('MCuotaCliente');
						$cuota->fechaVencimiento = $fechaVencimiento;
						$cuota->montoCuota = $montoCuota;
						$cuota->status = FALSE;
						$cuota->factura = $docFC;
						$cuota->refFactura = 'Factura Num: ' . $docFC->numeroFactura . ' Cuota Num: ' . $numCuota . ' Vence el ' . $cuota->getFechaVencimientoToString();
						$listaCuotas[] = $cuota;
						//echo "<br>cuota es: ",$cuota;

						//se crea la clase ke lleva el historico del saldo y documento que afecto la cta cliente... carlos

						$cuentaCliente->epSetDirty(TRUE);
						$cuentaCliente->commit();
						$cuota->commit();
					}

				}
			}

		}

		//////////////////////////////////////////////********************************/////////////////////////////////////////////////////////

		if ($restantePorPagar == 0) {
			
			//echo '<br>se pago todo';
			//echo "<br>aqui la condicion ",$condicionPago;
			//***********************ACTUALIZACION CUENTA POR COBRAR**************************************//
			$cuentas = $configuracion[0]->cuenta;

			$numero = 0;

			foreach ($condicionPago->plazo as $plazo) {

				//echo "<br>entra en cada condicion la primera vez";
				if ($plazo->diasPlazo == 0 || $plazo->diasPlazo < 1 and count($docFC->formaPagoList)>0) {

					//echo "<br>plazo cero";
					$porcentaje = $plazo->porcentaje;
					$porcentajeRestante = 100 - $porcentaje;
					$montoPorCobrar = $restantePorPagar;
					$montoTotal = 100 * $restantePorPagar / $porcentajeRestante;

					$fecha = time();
					// recibo de pago
					$docRF = $session->create('DReciboFactura');
					$newEfacade = & EFacade :: initWorkflow($facade->session, $docRF, & $role);
					$docRF->montoPago = $docFC->totalPagado;
					$concepto = "Pago Factura " . $docFC->getNumeroFactura();
					$docRF->concepto = $concepto;
					$docRF->fecha = $fecha;
					$docFC->recibo = $docRF;
					//echo "<br>Inicia el wf de orden de actividad";
					//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
					$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */
					3);
					//echo "newefacde de OA es: ",$newEfacade;
					//echo "<br>el transsetOT es: ",$transSetOT;
					$transOT = $transSetOT->getTransByName('t1');
					//echo "<br>transOA",$transOT;
					$usuario = NULL;
					$newEfacade->fireTrans($transOT, $usuario, "Crear", TRUE);
					//						echo "<br><br>EL DOCROOT ES: ",$docRoot;
					$docRF->epSetDirty(TRUE); // marcar el documento para que sea salvado los cambios en su lista de items
					$newEfacade->saveWorkflow();
					$docRF->diferenciador = $docRF->getDocumentDifer();
					$docFC->cliente = $docFC->cliente;
					$docRF->commit();
					$docRF->numero = $docRF->getDocumentNumber();
					$docRF->diferenciador = $docRF->getDocumentDifer();

					////////////////historico pago de contado//////////////
					$listaHistoricoCuentas = $session->create('MListaHistoricoCuentas');
					$listaHistoricoCuentas->fecha = date('U');
					$listaHistoricoCuentas->saldo = $saldoClienteNuevo - $docFC->totalPagado;
					$listaHistoricoCuentas->credito = $docFC->totalPagado;

					$docFC->numero = $docFC->getDocumentNumber();

					$listaHistoricoCuentas->referencia = $docRF->numero;
					$listaHistoricoCuentas->documento = $docRF;
					$listaHistoricoCuentas->commit();
					////////////////////////////////////////////
					$cuentaCliente->saldo = $saldoClienteNuevo - $docFC->totalPagado;
					$cuentaCliente->historico[] = $listaHistoricoCuentas;
					$cuentaCliente->commit();
					/////////////////////////

					$docRF->commit();
					//echo "<br>acabo de crerar el recibo ",$docRF;
					unset ($newEfacade);
					$facade->session->evictAll('MEdge');
					$facade->session->evictAll('MTrans');
					$facade->session->evictAll('MPlace');
					break;
				}
			}
			//echo "<br>veo cuales son los plazos";

		}

		/////////////////////////////////////////////********************************/////////////////////////////////////////////////////////

		//Creacion del documento orden de despacho y asociación de los
		///tipos de productos a despachar

		/**TODO: Verificar el departamento
		 * 
		 */
		$departamento = $ezpdo_->get('MDepartamento', 1);
		//		$docOD=$session->create('DOrdenDespacho');
		//		$docOD->cliente=$docFC->cliente;
		//		$docOD->factura=$docFC;
		//		$docOD->variante = $docFC->variante;
		//		$listaProductos=$docFC->productoList;
		//		$docOD->departamento=$departamento;
		//		$solicitudes=array();
		//		foreach($listaProductos as $lista){
		//			$producto=$lista->producto;
		//			$cantidad=$lista->cantidad;
		//			$listaSolicitud=$ezpdo_->create('MListaSolicitud');
		//			$listaSolicitud->cantidad=stringToNumber($cantidad);
		//			$listaSolicitud->producto=$producto;
		//			//echo "<br>la solicitud es: ",$listaSolicitud;
		//			$solicitudes[]=$listaSolicitud;
		//		}
		//		$docOD->listaSolicitudes=$solicitudes;
		//		$role=NULL;
		//		$newEfacade =& EFacade :: initWorkflow($facade->session, $docOD, & $role);
		//		//echo "<br>Inicia el wf de orden de actividad";
		//		//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
		//		$transSetOD = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);
		//		//echo "newefacde de OA es: ",$newEfacade;
		//		//echo "<br>el transsetOT es: ",$transSetOT;
		//		$transOD = $transSetOD->getTransByName('t1');
		//		//echo "<br>transOA",$transOT;
		//		$usuario=NULL;
		//		//echo '<br>antes de firetrans';
		//		$newEfacade->fireTrans($transOD, $usuario, "Crear",TRUE);
		////						echo "<br><br>EL DOCROOT ES: ",$docRoot;
		//       // echo '<br>despues';
		//		$docOD->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
		//		$newEfacade->saveWorkflow();
		//		$docOD->diferenciador=$docOD->getDocumentDifer();
		//		$docOD->commit();
		//		$docOD->numero = $docOD->getDocumentNumber();
		//		$docOD->diferenciador=$docOD->getDocumentDifer();
		//		$docOD->commit();
		//echo "<br>acabo de crerar el giro ",$docGC;
		unset ($newEfacade);
		$facade->session->evictAll('MEdge');
		$facade->session->evictAll('MTrans');
		$facade->session->evictAll('MPlace');

		$workflowFC = & $docFC->getWorkflowRef();
		$facade->session->refresh($workflowFC);
		$transSetFC = & EFacade :: getCurrentTransSetAuto($workflowFC, /* MTrans :: $TYPE_AUTO_AGENT */
		2);

		if (count($plazos) > 1) {
			$transFC = & $transSetFC->getTransByName('t3');
		} else {
			$transFC = & $transSetFC->getTransByName('t2');
		}

		$user = NULL;
		$facade->fireTrans($transFC, $user, 'Generacion de Factura', FALSE);

		$workflowFC->epSetDirty(TRUE); // marcar el workflow para que sea salvado los cambios en sus worktrans
		$docFC->epSetDirty(TRUE); // marcar el documento para que sea salvado los cambios en su lista de items
		$facade->saveWorkflow();
		//echo "<br>termina el agnet";

	}

	public function totalPagos(EFacade & $facade) {

		$docFC = & $facade->getDocumentRoot();

		//verificar si los pagos se han realizado o no
		/**TODO: Verificar los pagos realziados a giros y/o cuotas
		 * 
		 */

		//cuenta las cuotas ke han sido pagada en su totalidad
		$cont = 0;
		foreach ($docFC->cuotas as $cuota) {

			if ($cuota->status == true) {
				$cont++;
			}
		}

		if (count($docFC->cuotas) == $cont and $cont != 0) {
			$todoPago = TRUE;
			//echo '<hr> claro si';
		}

		$cont = 0;
		foreach ($docFC->giros as $giro) {

			if ($giro->status == true) {
				$cont++;
			}
		}

		if (count($docFC->giros) == $cont) {
			$todoPago = TRUE;
			//echo '<hr> claro si';
		}

		$workflowFC = & $docFC->getWorkflowRef();
		$facade->session->refresh($workflowFC);
		$transSetFC = & EFacade :: getCurrentTransSetAuto($workflowFC, /* MTrans :: $TYPE_AUTO_AGENT */
		2);

		if ($todoPago) {
			$transFC = & $transSetFC->getTransByName('t6');
		} else {
			$transFC = & $transSetFC->getTransByName('t5');
		}

		$user = NULL;
		$facade->fireTrans($transFC, $user, 'Verificación de pago completo', FALSE);

		$workflowFC->epSetDirty(TRUE); // marcar el workflow para que sea salvado los cambios en sus worktrans
		$docFC->epSetDirty(TRUE); // marcar el documento para que sea salvado los cambios en su lista de items
		$facade->saveWorkflow();

	}
}
?>